package com.djl.webmvc;
import com.djl.context.ApplicationContext;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author dongjialin
 *
 * remark：SpringMvc中 DispatcherServlet并非直接继承HttpServlet 其中还有FrameworkServlet,HttpServletBean等等
 * 此处我就简写直接继承HttpServlet,后续此类情况我就不一一解释了
 *
 * 1：首先考虑的问题
 *      1.1：为什么项目启动只需要idea配置Tomcat,web.xml,引入Servlet 就能直接通过启动Tomcat来实现IOC/DI
 *  容器的创建及其属性赋值？
 *      答：此处就来聊聊Servlet的生命周期。分两种情况,如下：
 *          第一种：在webxml中配置 <load-on-startup>1</load-on-startup> 则表示Tomcat启动就会创建Servlet,
 *                      即Servlet生命周期为：实例化(new Servlet)->初始化(init())->service()->destory()
 *          第二种：如未配置,则服务器被第一次访问才 实例化(new Servlet)->初始化(init())->service()->destory()
 *      1.2：DispatcherServlet到底是什么？究竟做了什么？
 *      答：请自行阅读以下代码
 *
 */
public class DispatcherServlet extends HttpServlet {

    private ApplicationContext context;

    @Override
    public void init() throws ServletException {
        context = new ApplicationContext(this.getServletConfig());
        initStrategies(context);
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doDispatcher(req);
    }

    private void doDispatcher(HttpServletRequest req) {

    }

    protected void initStrategies(ApplicationContext context) {
        this.initHandlerMappings(context);
        this.initHandlerAdapters(context);
        this.initViewResolvers(context);
    }

    /**
     * 初始化视图解析器
     */
    private void initViewResolvers(ApplicationContext context) {

    }

    /**
     * 初始化请求适配器
     */
    private void initHandlerAdapters(ApplicationContext context) {

    }

    /**
     * 初始化映射处理器
     */
    private void initHandlerMappings(ApplicationContext context) {

    }

}
